package com.easy.frame.common.process.entity.define;

import com.easy.frame.common.process.core.getter.AbstractExaminePersonGetter;
import com.easy.frame.common.process.core.getter.ITargetInfoGetter;
import com.easy.frame.common.process.entity.ProcessProperty;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

/**
 * 流程定义实体类
 * <p>
 * 定义一个流程，包括：
 * 1、这个流程关联的表
 * 2、可选条件信息
 * <p>
 * 附加功能
 * 4、一些触发事件
 * <p>
 * 前提：
 * 1、用户对象信息
 * 2、获取用户对象
 *
 * @author zzf
 * @date 12:01 2021/3/16
 */
@Data
@ApiModel("流程定义实体类")
@Accessors(chain = true)
public class ProcessDefine<T> implements Serializable {

    /**
     * 名称
     */
    private String name;

    /**
     * 编号
     */
    private String code;

    /**
     * 关联的表对应的实体类
     */
    private Class<T> targetClass;

    /**
     * 用于获取用户信息的方法
     */
    private ITargetInfoGetter<T> targetInfoGetter;

    /**
     * 用于获取审核人员信息的类
     */
    private Collection<AbstractExaminePersonGetter> entityFieldPersonGetters;

    /**
     * 前端打开流程时触发操作
     */
    private String eventAtOpen;

    /**
     * 前端关闭流程时触发操作
     */
    private String eventAtClose;

    /**
     * 打开流程时触发操作
     */
    private String afterFinish;

    /**
     * 打开流程时触发操作
     */
    private String beforeBegin;

    /**
     * 流程配置参数
     */
    private ProcessProperty<?> processProperty;


    public Set<AbstractExaminePersonGetter> allExaminePersonGetterSet() {
        HashSet<AbstractExaminePersonGetter> result = new HashSet<>();
        Optional.of(entityFieldPersonGetters)
                .ifPresent(result::addAll);

        Optional.of(processProperty)
                .map(ProcessProperty::getExaminePersonGetters)
                .ifPresent(result::addAll);
        return result;
    }

}
